{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "de6537c4",
   "metadata": {},
   "source": [
    "# Response Evaluator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9080b39e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import logging\n",
    "import sys\n",
    "\n",
    "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n",
    "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "8d0b2364-4806-4656-81e7-3f6e4b910b5b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from llama_index import (\n",
    "    TreeIndex,\n",
    "    VectorStoreIndex,\n",
    "    SimpleDirectoryReader,\n",
    "    LLMPredictor,\n",
    "    ServiceContext,\n",
    "    Response,\n",
    ")\n",
    "from llama_index.llms import OpenAI\n",
    "from llama_index.evaluation import ResponseEvaluator\n",
    "import pandas as pd\n",
    "\n",
    "pd.set_option(\"display.max_colwidth\", 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b9b98f89-d5b8-4d29-92f6-ad76d5060e9f",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# gpt-3 (davinci)\n",
    "gpt3 = OpenAI(temperature=0, model=\"text-davinci-003\")\n",
    "service_context_gpt3 = ServiceContext.from_defaults(llm=gpt3)\n",
    "\n",
    "# gpt-4\n",
    "gpt4 = OpenAI(temperature=0, model=\"gpt-4\")\n",
    "service_context_gpt4 = ServiceContext.from_defaults(llm=gpt4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8eb3e616-64e5-4bf4-a67b-661e9b3657e7",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "evaluator = ResponseEvaluator(service_context=service_context_gpt3)\n",
    "evaluator_gpt4 = ResponseEvaluator(service_context=service_context_gpt4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "1298bbb4-c99e-431e-93ef-eb32c0a2fc2a",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "documents = SimpleDirectoryReader(\"../test_wiki/data\").load_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "dca06a5b-8a15-40b4-8c7f-dae5407c674f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# create tree index\n",
    "tree_index = TreeIndex.from_documents(documents=documents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "41f0e53f-77a6-40d5-94ae-3f81b01af75c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total LLM token usage: 0 tokens\n",
      "> [build_index_from_nodes] Total LLM token usage: 0 tokens\n",
      "INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total embedding token usage: 44108 tokens\n",
      "> [build_index_from_nodes] Total embedding token usage: 44108 tokens\n"
     ]
    }
   ],
   "source": [
    "# create vector index\n",
    "vector_index = VectorStoreIndex.from_documents(\n",
    "    documents, service_context=ServiceContext.from_defaults(chunk_size=512)\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "af730b2e-6949-4865-b7af-bb2bc60a9173",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# define jupyter display function\n",
    "def display_eval_df(response: Response, eval_result: str) -> None:\n",
    "    eval_df = pd.DataFrame(\n",
    "        {\n",
    "            \"Response\": str(response),\n",
    "            \"Source\": response.source_nodes[0].source_text[:1000] + \"...\",\n",
    "            \"Evaluation Result\": eval_result,\n",
    "        },\n",
    "        index=[0],\n",
    "    )\n",
    "    eval_df = eval_df.style.set_properties(\n",
    "        **{\n",
    "            \"inline-size\": \"600px\",\n",
    "            \"overflow-wrap\": \"break-word\",\n",
    "        },\n",
    "        subset=[\"Response\", \"Source\"]\n",
    "    )\n",
    "    display(eval_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "68c9ebfe-b1b6-4f4e-9278-174346de8c90",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 4332 tokens\n",
      "> [query] Total LLM token usage: 4332 tokens\n",
      "INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 0 tokens\n",
      "> [query] Total embedding token usage: 0 tokens\n"
     ]
    }
   ],
   "source": [
    "query_engine = tree_index.as_query_engine()\n",
    "response_tree = query_engine.query(\n",
    "    \"What battles took place in New York City in the American Revolution?\"\n",
    ")\n",
    "eval_result = evaluator_gpt4.evaluate(response_tree)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "db9d00bc-8428-4a08-b48e-248ad7570923",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "#T_e9b07_row0_col0, #T_e9b07_row0_col1 {\n",
       "  inline-size: 600px;\n",
       "  overflow-wrap: break-word;\n",
       "}\n",
       "</style>\n",
       "<table id=\"T_e9b07\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th class=\"blank level0\" >&nbsp;</th>\n",
       "      <th id=\"T_e9b07_level0_col0\" class=\"col_heading level0 col0\" >Response</th>\n",
       "      <th id=\"T_e9b07_level0_col1\" class=\"col_heading level0 col1\" >Source</th>\n",
       "      <th id=\"T_e9b07_level0_col2\" class=\"col_heading level0 col2\" >Evaluation Result</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th id=\"T_e9b07_level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "      <td id=\"T_e9b07_row0_col0\" class=\"data row0 col0\" >The Battle of Long Island, the Battle of White Plains, the Battle of Harlem Heights, the Battle of Fort Washington, the Battle of Fort Lee, and the Battle of Yorktown all took place in New York City during the American Revolution. These battles took place in various locations throughout the city, including Battery Weed and Fort Tompkins, Great Kills Park, and Central Park.</td>\n",
       "      <td id=\"T_e9b07_row0_col1\" class=\"data row0 col1\" >in 2015 makes it the highest of any county in the United States and higher than the density of any individual American city.Manhattan is the cultural, administrative, and financial center of New York City and contains the headquarters of many major multinational corporations, the United Nations headquarters, Wall Street, and a number of important universities. The borough of Manhattan is often described as the financial and cultural center of the world.Most of the borough is situated on Manhattan Island, at the mouth of the Hudson River and the East River, and its southern tip, at the confluence of the two rivers, represents the birthplace of New York City itself. Several small islands also compose part of the borough of Manhattan, including Randalls and Wards Islands, and Roosevelt Island in the East River, and Governors Island and Liberty Island to the south in New York Harbor.\n",
       "Manhattan Island is loosely divided into the Lower, Midtown, and Uptown regions. Uptown Manhattan is divide...</td>\n",
       "      <td id=\"T_e9b07_row0_col2\" class=\"data row0 col2\" >NO</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x296847df0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display_eval_df(response_tree, eval_result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "edb91d53",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "180a5d2e-9286-477b-9cd0-a5976d18d845",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "query_engine = vector_index.as_query_engine()\n",
    "response_vector = query_engine.query(\n",
    "    \"What battles took place in New York City in the American Revolution?\"\n",
    ")\n",
    "eval_result = evaluator_gpt4.evaluate(response_vector)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "c764b8b3-69b1-4ac8-b88b-3f9e204b8bfb",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "#T_bf32a_row0_col0, #T_bf32a_row0_col1 {\n",
       "  inline-size: 600px;\n",
       "  overflow-wrap: break-word;\n",
       "}\n",
       "</style>\n",
       "<table id=\"T_bf32a\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th class=\"blank level0\" >&nbsp;</th>\n",
       "      <th id=\"T_bf32a_level0_col0\" class=\"col_heading level0 col0\" >Response</th>\n",
       "      <th id=\"T_bf32a_level0_col1\" class=\"col_heading level0 col1\" >Source</th>\n",
       "      <th id=\"T_bf32a_level0_col2\" class=\"col_heading level0 col2\" >Evaluation Result</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th id=\"T_bf32a_level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "      <td id=\"T_bf32a_row0_col0\" class=\"data row0 col0\" >\n",
       "The Battle of Long Island and the Great Fire of New York.</td>\n",
       "      <td id=\"T_bf32a_row0_col1\" class=\"data row0 col1\" >at labor. Slavery became integrally tied to New York's economy through the labor of slaves throughout the port, and the banking and shipping industries trading with the American South. During construction in Foley Square in the 1990s, the African Burying Ground was discovered; the cemetery included 10,000 to 20,000 of graves of colonial-era Africans, some enslaved and some free.The 1735 trial and acquittal in Manhattan of John Peter Zenger, who had been accused of seditious libel after criticizing colonial governor William Cosby, helped to establish the freedom of the press in North America. In 1754, Columbia University was founded under charter by King George II as King's College in Lower Manhattan.\n",
       "\n",
       "\n",
       "=== American Revolution ===\n",
       "\n",
       "The Stamp Act Congress met in New York in October 1765, as the Sons of Liberty organization emerged in the city and skirmished over the next ten years with British troops stationed there. The Battle of Long Island, the largest battle of the American Revolutio...</td>\n",
       "      <td id=\"T_bf32a_row0_col2\" class=\"data row0 col2\" >YES</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x2968446a0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display_eval_df(response_vector, eval_result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4fc3f18a-0ef9-453c-acf8-7aedd784cdcf",
   "metadata": {},
   "outputs": [],
   "source": [
    "query_engine = tree_index.as_query_engine()\n",
    "response_tree = query_engine.query(\"What are the airports in New York City?\")\n",
    "eval_result = evaluator_gpt4.evaluate(response_tree)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "a34490f6-7242-4c31-b49e-b2a65d9923ab",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "#T_08e51_row0_col0, #T_08e51_row0_col1 {\n",
       "  inline-size: 600px;\n",
       "  overflow-wrap: break-word;\n",
       "}\n",
       "</style>\n",
       "<table id=\"T_08e51\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th class=\"blank level0\" >&nbsp;</th>\n",
       "      <th id=\"T_08e51_level0_col0\" class=\"col_heading level0 col0\" >Response</th>\n",
       "      <th id=\"T_08e51_level0_col1\" class=\"col_heading level0 col1\" >Source</th>\n",
       "      <th id=\"T_08e51_level0_col2\" class=\"col_heading level0 col2\" >Evaluation Result</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th id=\"T_08e51_level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "      <td id=\"T_08e51_row0_col0\" class=\"data row0 col0\" >The airports in New York City are John F. Kennedy International Airport (JFK), LaGuardia Airport (LGA), and Newark Liberty International Airport (EWR).</td>\n",
       "      <td id=\"T_08e51_row0_col1\" class=\"data row0 col1\" >Avenue are also used as metonyms for national industries there: the theater, finance, advertising, and fashion organizations, respectively.\n",
       "New York City also has an extensive web of freeways and parkways, which link the city's boroughs to each other and to North Jersey, Westchester County, Long Island, and southwestern Connecticut through various bridges and tunnels. Because these highways serve millions of outer borough and suburban residents who commute into Manhattan, it is quite common for motorists to be stranded for hours in traffic congestion that are a daily occurrence, particularly during rush hour. Congestion pricing in New York City will go into effect in 2022 at the earliest.New York City is also known for its rules regarding turning at red lights. Unlike the rest of the United States, New York State prohibits right or left turns on red in cities with a population greater than one million, to reduce traffic collisions and increase pedestrian safety. In New York City, there...</td>\n",
       "      <td id=\"T_08e51_row0_col2\" class=\"data row0 col2\" >NO</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x296846170>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display_eval_df(response_tree, eval_result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "97f3ddf1-8dc2-4fb8-831f-2c06649e0955",
   "metadata": {},
   "outputs": [],
   "source": [
    "query_engine = vector_index.as_query_engine()\n",
    "response_vector = query_engine.query(\"What are the airports in New York City?\")\n",
    "eval_result = evaluator_gpt4.evaluate(response_vector)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "01c53014-82b0-4865-b849-c0beb042143d",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "#T_82fc9_row0_col0, #T_82fc9_row0_col1 {\n",
       "  inline-size: 600px;\n",
       "  overflow-wrap: break-word;\n",
       "}\n",
       "</style>\n",
       "<table id=\"T_82fc9\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th class=\"blank level0\" >&nbsp;</th>\n",
       "      <th id=\"T_82fc9_level0_col0\" class=\"col_heading level0 col0\" >Response</th>\n",
       "      <th id=\"T_82fc9_level0_col1\" class=\"col_heading level0 col1\" >Source</th>\n",
       "      <th id=\"T_82fc9_level0_col2\" class=\"col_heading level0 col2\" >Evaluation Result</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th id=\"T_82fc9_level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "      <td id=\"T_82fc9_row0_col0\" class=\"data row0 col0\" >\n",
       "The airports in New York City are Long Island MacArthur Airport, Trenton–Mercer Airport, Westchester County Airport, and Teterboro Airport.</td>\n",
       "      <td id=\"T_82fc9_row0_col1\" class=\"data row0 col1\" >announced in July 2015 to entirely rebuild LaGuardia Airport in a multibillion-dollar project to replace its aging facilities. Other commercial airports in or serving the New York metropolitan area include Long Island MacArthur Airport, Trenton–Mercer Airport and Westchester County Airport. The primary general aviation airport serving the area is Teterboro Airport.\n",
       "\n",
       "\n",
       "=== Ferries ===\n",
       "\n",
       "The Staten Island Ferry is the world's busiest ferry route, carrying more than 23 million passengers from July 2015 through June 2016 on the 5.2-mile (8.4 km) route between Staten Island and Lower Manhattan and running 24 hours a day. Other ferry systems shuttle commuters between Manhattan and other locales within the city and the metropolitan area.\n",
       "NYC Ferry, a NYCEDC initiative with routes planned to travel to all five boroughs, was launched in 2017, with second graders choosing the names of the ferries. Meanwhile, Seastreak ferry announced construction of a 600-passenger high-speed luxury ferry in Septe...</td>\n",
       "      <td id=\"T_82fc9_row0_col2\" class=\"data row0 col2\" >YES</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x296847ac0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display_eval_df(response_vector, eval_result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8b860691-9f6a-4b2f-bfef-5a5a56693a18",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "query_engine = vector_index.as_query_engine()\n",
    "response_vector = query_engine.query(\"Who is the mayor of New York City?\")\n",
    "eval_result = evaluator_gpt4.evaluate(response_vector)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "91cce4e3-b4e5-4583-9543-6c3726c0e7d3",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "#T_9373c_row0_col0, #T_9373c_row0_col1 {\n",
       "  inline-size: 600px;\n",
       "  overflow-wrap: break-word;\n",
       "}\n",
       "</style>\n",
       "<table id=\"T_9373c\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th class=\"blank level0\" >&nbsp;</th>\n",
       "      <th id=\"T_9373c_level0_col0\" class=\"col_heading level0 col0\" >Response</th>\n",
       "      <th id=\"T_9373c_level0_col1\" class=\"col_heading level0 col1\" >Source</th>\n",
       "      <th id=\"T_9373c_level0_col2\" class=\"col_heading level0 col2\" >Evaluation Result</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th id=\"T_9373c_level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "      <td id=\"T_9373c_row0_col0\" class=\"data row0 col0\" >\n",
       "The mayor of New York City is Eric Adams.</td>\n",
       "      <td id=\"T_9373c_row0_col1\" class=\"data row0 col1\" >by geographic population boundaries. Each term for the mayor and council members lasts four years and has a two consecutive-term limit, which is reset after a four-year break. The New York City Administrative Code, the New York City Rules, and the City Record are the code of local laws, compilation of regulations, and official journal, respectively.Each borough is coextensive with a judicial district of the state Unified Court System, of which the Criminal Court and the Civil Court are the local courts, while the New York Supreme Court conducts major trials and appeals. Manhattan hosts the First Department of the Supreme Court, Appellate Division while Brooklyn hosts the Second Department. There are also several extrajudicial administrative courts, which are executive agencies and not part of the state Unified Court System.\n",
       "Uniquely among major American cities, New York is divided between, and is host to the main branches of, two different U.S. district courts: the District Court for t...</td>\n",
       "      <td id=\"T_9373c_row0_col2\" class=\"data row0 col2\" >YES</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x2958ca410>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display_eval_df(response_vector, eval_result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8b1ccc17-d16f-4440-bdf2-15c83bc81159",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "llama_index",
   "language": "python",
   "name": "llama_index"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
